<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="BLDte" id="BLDte"><span data-lake-id="u41fd9957" id="u41fd9957">典型回答</span></h1>
  <p data-lake-id="ufbcc7f99" id="ufbcc7f99"><br></p>
  <p data-lake-id="u932ec779" id="u932ec779"><strong><span data-lake-id="uee752763" id="uee752763">责任链模式的目的是避免请求发送者与多个接收者之间的耦合关系，将这些接收者组成一条链，并沿着这条链传递请求，直到有一个接收者处理它为止。</span></strong></p>
  <p data-lake-id="u6da15fa2" id="u6da15fa2"><span data-lake-id="u1ad7cec5" id="u1ad7cec5">​</span><br></p>
  <p data-lake-id="u7712cf02" id="u7712cf02"><span data-lake-id="u2ed5f07b" id="u2ed5f07b">在责任链模式中，通常将处理请求的对象称为处理器或者链的节点，每个节点都包含了处理该请求的逻辑以及指向下一个节点的引用。当请求到达一个节点时，如果该节点无法处理该请求，它会将请求转发给下一个节点，直到有一个节点处理该请求或者整个链都无法处理该请求。</span></p>
  <p data-lake-id="u18c128d9" id="u18c128d9"><span data-lake-id="u6d28db43" id="u6d28db43">​</span><br></p>
  <p data-lake-id="u40f5b41f" id="u40f5b41f"><span data-lake-id="u9366bbd1" id="u9366bbd1">责任链模式在实际开发中有很多应用场景，比如：</span></p>
  <ol list="ufdf06e98">
   <li fid="u7c814e4a" data-lake-id="uee029e4e" id="uee029e4e"><span data-lake-id="u60cee0a8" id="u60cee0a8">过滤器链：在Web开发中，可以通过责任链模式来实现过滤器链，例如Spring框架中的FilterChain就是一条责任链，每个过滤器都有机会对请求进行处理，直到最后一个过滤器处理完毕。</span></li>
  </ol>
  <p data-lake-id="u4d6cc108" id="u4d6cc108"><br></p>
  <ol list="ufdf06e98" start="2">
   <li fid="u7c814e4a" data-lake-id="u9d552f60" id="u9d552f60"><span data-lake-id="u5cd6d9a8" id="u5cd6d9a8">日志记录器：在日志系统中，可以使用责任链模式来将日志记录器组成一条链，从而实现多种日志记录方式的灵活组合。</span></li>
  </ol>
  <p data-lake-id="u531d2e49" id="u531d2e49"><br></p>
  <ol list="ufdf06e98" start="3">
   <li fid="u7c814e4a" data-lake-id="u23e61871" id="u23e61871"><span data-lake-id="u3bc7c41d" id="u3bc7c41d">异常处理器：在应用程序中，可以使用责任链模式来实现异常处理器的链式调用，从而灵活地处理各种异常情况。</span></li>
  </ol>
  <p data-lake-id="u109b8a82" id="u109b8a82"><br></p>
  <ol list="ufdf06e98" start="4">
   <li fid="u7c814e4a" data-lake-id="u666470a5" id="u666470a5"><span data-lake-id="u75293f2c" id="u75293f2c">授权认证：在系统中，可以使用责任链模式来实现授权认证的链式调用，从而灵活地控制不同用户对系统的访问权限。</span></li>
  </ol>
  <p data-lake-id="uc28491bc" id="uc28491bc"><br></p>
  <h1 data-lake-id="QgBNh" id="QgBNh"><span data-lake-id="u4bee1635" id="u4bee1635">扩展知识</span></h1>
  <p data-lake-id="u915c50bc" id="u915c50bc"><br></p>
  <h2 data-lake-id="ps4KR" id="ps4KR"><span data-lake-id="uec9af39d" id="uec9af39d">示例</span></h2>
  <p data-lake-id="ub226cfeb" id="ub226cfeb"><br></p>
  <p data-lake-id="u0366d004" id="u0366d004"><span data-lake-id="u055e12a6" id="u055e12a6">下面以一个订单处理的场景为例，介绍如何使用责任链模式：</span></p>
  <p data-lake-id="ufc00fcec" id="ufc00fcec"><span data-lake-id="u4f32ec13" id="u4f32ec13">假设我们有一个在线商店，当用户下单时，订单需要经过以下几个步骤：</span></p>
  <ol list="u03765c45">
   <li fid="u20c8bc4b" data-lake-id="u4cad14c8" id="u4cad14c8"><span data-lake-id="u4d7f6c24" id="u4d7f6c24">检查订单信息是否完整</span></li>
   <li fid="u20c8bc4b" data-lake-id="ueaa4b9a1" id="ueaa4b9a1"><span data-lake-id="u3e382686" id="u3e382686">检查商品库存是否充足</span></li>
   <li fid="u20c8bc4b" data-lake-id="ub2c1c043" id="ub2c1c043"><span data-lake-id="uddd03410" id="uddd03410">检查用户余额是否充足</span></li>
   <li fid="u20c8bc4b" data-lake-id="u5c0d4339" id="u5c0d4339"><span data-lake-id="uc755acf1" id="uc755acf1">确认订单，更新商品库存和用户余额</span></li>
  </ol>
  <p data-lake-id="u00544f90" id="u00544f90"><span data-lake-id="ubf01195d" id="ubf01195d">我们可以将每个步骤封装成一个处理者，然后使用责任链模式将它们连接起来，形成一个处理链。</span></p>
  <p data-lake-id="u7f35ef7d" id="u7f35ef7d"><span data-lake-id="u79df74b6" id="u79df74b6">首先定义一个处理者接口 OrderHandler：</span></p>
  <p data-lake-id="u54fba9ea" id="u54fba9ea"><span data-lake-id="u4d8ff377" id="u4d8ff377">​</span><br></p>
  <pre lang="java"><code>
public interface OrderHandler {
    void handle(Order order);
}

</code></pre>
  <p data-lake-id="uc8ac3622" id="uc8ac3622"><br></p>
  <p data-lake-id="u72a98cec" id="u72a98cec"><span data-lake-id="u8f0cf3d2" id="u8f0cf3d2">然后实现每个步骤对应的Handler：</span></p>
  <p data-lake-id="ub25fb7f7" id="ub25fb7f7"><span data-lake-id="u13598340" id="u13598340">​</span><br></p>
  <pre lang="java"><code>
public class CheckOrderHandler implements OrderHandler {
    private OrderHandler next;

    public CheckOrderHandler(OrderHandler next) {
        this.next = next;
    }

    @Override
    public void handle(Order order) {
        // 检查订单信息是否完整
        if (order.isInfoComplete()) {
            // 如果订单信息完整，则将请求传递给下一个处理者
            next.handle(order);
        } else {
            // 如果订单信息不完整，则直接返回错误信息
            throw new RuntimeException("订单信息不完整");
        }
    }
}

public class CheckStockHandler implements OrderHandler {
    private OrderHandler next;

    public CheckStockHandler(OrderHandler next) {
        this.next = next;
    }

    @Override
    public void handle(Order order) {
        // 检查商品库存是否充足
        if (order.getStock() &gt;= order.getQuantity()) {
            // 如果库存充足，则将请求传递给下一个处理者
            next.handle(order);
        } else {
            // 如果库存不足，则直接返回错误信息
            throw new RuntimeException("商品库存不足");
        }
    }
}

public class CheckBalanceHandler implements OrderHandler {
    private OrderHandler next;

    public CheckBalanceHandler(OrderHandler next) {
        this.next = next;
    }

    @Override
    public void handle(Order order) {
        // 检查用户余额是否充足
        if (order.getBalance() &gt;= order.getAmount()) {
            // 如果余额充足，则将请求传递给下一个处理者
            next.handle(order);
        } else {
            // 如果余额不足，则直接返回错误信息
            throw new RuntimeException("用户余额不足");
        }
    }
}

public class ConfirmOrderHandler implements OrderHandler {
    @Override
    public void handle(Order order) {
        // 确认订单，更新商品库存和用户余额
        order.confirm();
    }
}

</code></pre>
  <p data-lake-id="u3280c468" id="u3280c468"><br></p>
  <p data-lake-id="u61b31dbf" id="u61b31dbf"><span data-lake-id="u61a031b1" id="u61a031b1">其中每个处理者都有一个指向下一个处理者的引用，处理者之间通过调用下一个处理者的 handle 方法将请求传递下去。如果某个处理者无法处理请求，则直接返回错误信息。</span></p>
  <p data-lake-id="uaae7b977" id="uaae7b977"><span data-lake-id="u7975804b" id="u7975804b">​</span><br></p>
  <p data-lake-id="u639702b8" id="u639702b8"><span data-lake-id="ucc0602ab" id="ucc0602ab">最后，再将这些Handler串联起来按顺序执行即可。</span></p>
  <p data-lake-id="u141327b3" id="u141327b3"><span data-lake-id="u62106306" id="u62106306">​</span><br></p>
  <pre lang="java"><code>
// 客户端代码示例
CheckOrderHandler checkOrderHandler = new CheckOrderHandler();
CheckStockHandler checkStockHandler = new CheckStockHandler();
CheckBalanceHandler checkBalanceHandler = new CheckBalanceHandler();
ConfirmOrderHandler confirmOrderHandler = new ConfirmOrderHandler();


// 将处理器按照一定顺序组成责任链
checkOrderHandler.setNext(checkStockHandler);
checkStockHandler.setNext(checkBalanceHandler);
checkBalanceHandler.setNext(confirmOrderHandler);

// 处理订单
Order order = new Order();
checkOrderHandler.handle(order);
</code></pre>
 </body>
</html>